#include <head.h>

sem_t sem;

/*
信号量内部是维护了 int
    当 初始的 int = 5 时 则代表最多同时只能运行 5 个线程

    当一个线程 进行了 P操作的时候 会进行 -1 
    当五个线程 在运行的时候  此时的 int  = 0
    P操作的另一个特性 当 int = 0 时 等待

    等待 v 操作  当 v操作进行  +1   另一个进程就可以进行 P操作
*/

// 停车 函数 
void * Func_pthread(void * arg)
{
    int id = *((int *)arg);
    
    printf("我是 %d 车 我已经就绪\n" , id);

    sleep(1);

    // P操作  停车操作
    sem_wait(&sem);

    printf("我是 %d 车 我停车\n" , id);

    sleep(5);

    // V操作  停车完成
    sem_post(&sem);
    printf("我是 %d 车 完成停车\n" , id);
}

int main(int argc, char const *argv[])
{
    // 初始化无名信号量
    sem_init(&sem , 0 , 5);

    
    pthread_t tid[20];
    int id[20];
    
    for (size_t i = 0; i < 20; i++)
    {
        // 获取参数
        id[i] = i;
        // 线程的创建
        pthread_create(&tid[i] , NULL , Func_pthread , (void *)&id[i]);
        // 分离态
        pthread_detach(tid[i]);
    }
    
    getc(stdin);

    // 回收信号量
    sem_destroy(&sem);

    printf("回收完成");

    return 0;
}